package com.framework.common.dataTypeConfig.handler;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.framework.common.annotation.DataTypeTarget;
import com.framework.common.dataTypeConfig.core.ReplaceInterface;
import com.framework.common.util.reflect.ReflectUtil;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 龘鵺
 * @className com.framework.common.dataTypeConfig.handler
 * @description 替换处理类
 * @datetime 2025-01-09 11:11:11
 * @version 1.0
 */
public class ReplaceHandler extends JsonSerializer<Object> implements ContextualSerializer {
    /**
     * 全局翻译实现类映射器
     */
    public static final Map<String, ReplaceInterface<?>> TRANSLATION_MAPPER = new ConcurrentHashMap<>();

    private DataTypeTarget dataTypeTarget;

    /**
     * @param value       1 判断值
     * @param gen         2 json生成对象
     * @param serializers 3 序列化对象
     * @title 返回JSON处理
     * @description 返回JSON处理
     * @author 龘鵺
     * @datetime 2025-01-09 11:11:11
     */
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        ReplaceInterface<?> trans = TRANSLATION_MAPPER.get(dataTypeTarget.type());
//        Object parentValue = null;
        if (ObjectUtils.isNotEmpty(trans)) {
            // 如果映射字段不为空 则取映射字段的值
            if (StringUtils.isNotBlank(dataTypeTarget.fields())) {
                value = ReflectUtil.invokeGet(gen.getCurrentValue(), dataTypeTarget.fields());
            }
//            // 如果映射字段不为空 则取映射字段的值
//            if (StringUtils.isNotBlank(dataTypeTarget.parentFields())) {
//                parentValue = ReflectUtil.invokeGet(gen.getCurrentValue(), dataTypeTarget.parentFields());
//            }
            // 如果为 null 直接写出
            if (ObjectUtils.isEmpty(value)) {
                gen.writeNull();
                return;
            }
            Object result = trans.getValue(value, dataTypeTarget.code());
            gen.writeObject(result);
        } else {
            gen.writeObject(value);
        }
    }

    /**
     * @param prov     1 序列化对象
     * @param property 2 bean属性对象
     * @return com.fasterxml.jackson.databind.JsonSerializer<?>
     * @title json序列化处理
     * @description json序列化处理
     * @author 龘鵺
     * @datetime 2025-01-09 11:11:11
     */
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        DataTypeTarget dataTypeTarget = property.getAnnotation(DataTypeTarget.class);
        if (dataTypeTarget != null) {
            this.dataTypeTarget = dataTypeTarget;
            return this;
        }
        return prov.findValueSerializer(property.getType(), property);
    }

}
